package com.david.mydemo.ctl_thread.controller;

import com.david.mydemo.ctl_thread.service.CompletableFutureService;
import com.david.mydemo.util.MyResponse;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Api(value = "多线程测试-ThreadController", tags = "多线程测试-ThreadController")
@RestController
@RequestMapping(value = "/thread")
@Slf4j
public class ThreadController {

    @Autowired
    private CompletableFutureService completableFutureService;

    /**
     * 有返回值多线程方法一，匿名实现逻辑
     * <br/>CompletableFuture.supplyAsync()使用默认线程池（ForkJoinPool.commonPool()）的方法
     */
    @PostMapping("/supplyAsyncMethod1")
    public MyResponse supplyAsyncMethod1() {
        completableFutureService.supplyAsyncMethod1();
        return new MyResponse().success();
    }

    /**
     * 有返回值多线程方法二，调用方法
     * <br/>CompletableFuture.supplyAsync()使用默认线程池（ForkJoinPool.commonPool()）的方法
     */
    @PostMapping("/supplyAsyncMethod2")
    public MyResponse supplyAsyncMethod2() {
        completableFutureService.supplyAsyncMethod2();
        return new MyResponse().success();
    }

    /**
     * 有返回值多线程方法三，调用方法
     * <br/>CompletableFuture.supplyAsync()使用自定义线程池的方法
     */
    @PostMapping("/supplyAsyncMethod3")
    public MyResponse supplyAsyncMethod3() {
        completableFutureService.supplyAsyncMethod3();
        return new MyResponse().success();
    }

    /**
     * 无返回值多线程方法一，匿名实现逻辑
     * <br/>CompletableFuture.runAsync()使用默认线程池（ForkJoinPool.commonPool()）的方法
     */
    @PostMapping("/runAsyncMethod1")
    public MyResponse runAsyncMethod1() {
        completableFutureService.runAsyncMethod1();
        return new MyResponse().success();
    }

    /**
     * 无返回值多线程方法二，调用方法
     * <br/>CompletableFuture.runAsync()使用默认线程池（ForkJoinPool.commonPool()）的方法
     */
    @PostMapping("/runAsyncMethod2")
    public MyResponse runAsyncMethod2() {
        completableFutureService.runAsyncMethod2();
        return new MyResponse().success();
    }

    /**
     * 无返回值多线程方法三，调用方法
     * <br/>CompletableFuture.runAsync()使用自定义线程池的方法
     */
    @PostMapping("/runAsyncMethod3")
    public MyResponse runAsyncMethod3() {
        completableFutureService.runAsyncMethod3();
        return new MyResponse().success();
    }

    /**
     * 有返回值异步回调多线程方法一，匿名调用
     * <br/>CompletableFuture.thenApplyAsync()使用默认线程池的方法
     * <br/>使用thenApplyAsync在子任务中是另起一个线程执行任务，并且thenApplyAsync可以自定义线程池，默认的使用ForkJoinPool.commonPool()线程池
     */
    @PostMapping("/thenApplyAsyncMethod1")
    public MyResponse thenApplyAsyncMethod1() {
        completableFutureService.thenApplyAsyncMethod1();
        return new MyResponse().success();
    }

    /**
     * 有返回值异步回调多线程方法二，匿名调用
     * <br/>CompletableFuture.thenApply()使用默认线程池的方法
     * <br/>使用thenApply方法时子任务与父任务使用的是同一个线程
     */
    @PostMapping("/thenApplyMethod2")
    public MyResponse thenApplyMethod2() {
        completableFutureService.thenApplyMethod2();
        return new MyResponse().success();
    }


}
